/**
 * 文件工具
 * @author luguoxiang
 * @date 2021-09-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
// @ts-ignore
import {serverUrl, tokenName} from '@/config';
import {getToken} from './token';
import SparkMD5 from "@/soar/js_sdk/spark-md5";

/**
 * 压缩级别
 * @type {string[]}
 */
export type ThumbnailSizeEnum = 's' | 'm' | 'l';

/**
 * 判断图片类型正则
 */
const IMG_REG_EXP = /^image\/.+/;

/**
 * 文件扩展名
 */
const EXTENSIONS = {
  img: [
    'bmp',
    'jpg',
    'png',
    'tif',
    'gif',
    'pcx',
    'tga',
    'exif',
    'fpx',
    'svg',
    'psd',
    'cdr',
    'pcd',
    'dxf',
    'ufo',
    'eps',
    'ai',
    'raw',
    'WMF',
    'webp',
    'avif',
    'apng',
  ],
  video: ['mp4', 'mpeg', '3gp', 'avi', 'ts', 'mkv', 'wmv', 'mpg', 'mov', 'rm', 'ram', 'swf', 'flv'],
  audio: [
    'mp3',
    'aac',
    'wav',
    'wma',
    'cda',
    'flac',
    'm4a',
    'mid',
    'mka',
    'mp2',
    'mpa',
    'mpc',
    'ape',
    'ofr',
    'ogg',
    'ra',
    'wv',
    'tta',
    'ac3',
    'dts',
  ],
  word: ['doc', 'docx', 'pdf', 'txt'],
  excel: ['xls', 'xlsx'],
  ppt: ['ppt', 'pptx'],
  zip: ['zip', '.7z', 'rar'],
};

/**
 * 获取文件扩展名
 * @param filename
 */
export function getFileExtension(filename: string): string {
  const index = filename.lastIndexOf('.');
  return filename.substring(index + 1);
}

export function getFileTypeByExt(filename: string): string {
  const extension = getFileExtension(filename);
  for (const type in EXTENSIONS) {
    // @ts-ignore
    const exts = EXTENSIONS[type];
    for (const ext of exts) {
      if (ext === extension) {
        return type;
      }
    }
  }
  return 'other';
}

/**
 * 根据文件名称判断是否是图片
 * @param fileName
 */
export function isImgByName(fileName: string) {
  const extension = getFileExtension(fileName);
  return EXTENSIONS.img.includes(extension.toLowerCase());
}

/**
 * 根据文件类型判断是否是图片
 * @param fileType
 */
export function isImgByType(fileType: string) {
  return IMG_REG_EXP.test(fileType);
}

/**
 * 获取文件访问地址
 * @param url 原路径
 * @param level 压缩级别（仅lg-soar文件系统支持）
 * @returns {string|*}
 */
export function getFileAccessUrl(url: string, level?: ThumbnailSizeEnum): string {
  if (!url || url.startsWith('http') || url.startsWith('blob:') || url.startsWith('data:')) {
    return url;
  }
  if (url.startsWith('proxy/') && level) {
    url = url.includes('?') ? `${url}&s=${level}` : `${url}?s=${level}`;
  }
  return `${serverUrl}/system/file/${url}`;
}

/**
 * 文件访问授权地址(加授权 token 参数)
 * @param url
 * @param level
 * @returns {string}
 */
export function getFileAccessAuthUrl(url: string, level?: ThumbnailSizeEnum): string {
  if (!url || url.startsWith('http') || url.startsWith('blob:') || url.startsWith('data:')) {
    return url;
  }
  if (url.startsWith('proxy/') && level) {
    url = url.includes('?') ? `${url}&s=${level}` : `${url}?s=${level}`;
  }
  url = `${serverUrl}/system/file/${url}`;
  return url.includes('?') ? `${url}&${tokenName}=${getToken()}` : `${url}?${tokenName}=${getToken()}`;
}

/**
 * 获取文件md5值
 * @param tempFile
 */
export function fileToMd5(tempFile: any) {
  return new Promise((resolve, reject) => {
    // #ifdef WEB
    const fileReader = new FileReader();
    const spark = new SparkMD5.ArrayBuffer();
    const chunkSize = 2097152; // 2MB
    let position = 0;

    const calc = () => {
      const slice = tempFile.slice(position, chunkSize + position);
      position += chunkSize;
      fileReader.readAsArrayBuffer(slice);
    };

    fileReader.onload = (e) => {
      // 当文件被读取时，计算MD5
      spark.append(e.target.result);
      // 如果文件已经全部读取完毕，则计算最终的MD5
      if (position > tempFile.size) {
        resolve(spark.end());
      } else {
        // 否则继续读取文件的其余部分
        calc();
      }
    };

    fileReader.onerror = reject;

    calc();
    // #endif
    // #ifndef WEB
    uni.getFileInfo({
      filePath: tempFile as string,
      success(res) {
        resolve(res.digest)
      },
      fail: reject,
    })
    // #endif
  })
}